home *** CD-ROM | disk | FTP | other *** search
- /*
- DU_LIB v2
- Gem Window Management & Dialog Library For Lattice C
- ½1994, by Craig Graham.
-
- Based on the DU_LIBv1 Library for HiSoft Basic.
- */
-
- /*
- Popup Menu Handler
- */
-
- #include "dulib.h"
- #include <string.h>
-
- /*
- Side-pointing arrow (OSF Motif style) for popups
- */
- MFORM SIDEARRW =
- { 0x0001,0x0007,0x0002,0x0000,0x0001,
- /* Mask data */
- 0x0000,0x0000,0x0600,0x0E00,
- 0x1E00,0x3FFC,0x7FF4,0xFFF4,
- 0x7FF4,0x3FFC,0x1E00,0x0E00,
- 0x0600,0x0000,0x0000,0x0000,
- /* Cursor data */
- 0x0000,0x0000,0x0000,0x0400,
- 0x0C00,0x1C00,0x3FF8,0x7FF8,
- 0x3FF8,0x1C00,0x0C00,0x0400,
- 0x0000,0x0000,0x0000,0x0000
- };
-
- /*Form an <n> entry pop-up menu for <object> in <dialog>, and return a selection from it.*/
- short form_popup(short dialog,short object, short n, short current, char *t[])
- {
- static OBJECT popup[50];
- static TEDINFO texts[30];
- OBJECT* l;
- OBJECT* lt;
- TEDINFO* ltb;
- MFDB scr,obm;
- short p[8];
- short *buf;
- short mb,a,max_w,f;
- GRECT oxywh;
- short rtn;
- short c,e,mx,my,dummy,ex_f,sel_f;
-
- graf_mkstate(&mx,&my,&sel_f,&junk);
-
- if (sel_f) sel_f=TRUE; else sel_f=FALSE;
-
- vs_clip(x_handle, 0, NULL);
-
- rsrc_gaddr(0,dialog,&l);
- objc_xywh(l,object,&oxywh);
-
- if (n==0)
- {
- rtn=0;
- } else {
- popup->ob_next=-1; /*Create a popup menu structure*/
- popup->ob_head=1;
- popup->ob_tail=n+1;
- popup->ob_flags=0;
- popup->ob_state=mask_shadowed;
- popup->ob_type=G_BOX;
- #ifdef __USE_GNU
- popup->ob_spec=(unsigned long)70128;
- #else
- popup->ob_spec=(OBJECT*)70128;
- #endif
-
- max_w=1;
- lt=popup; ltb=texts;
-
- for(f=0; f<(n+1); f++)
- {
- a=strlen(t[f]);
- if (a>max_w) { max_w=a; }
- }
-
- if (oxywh.g_w<max_w*8+10) { oxywh.g_w=max_w*8+10; }
- if (oxywh.g_x+oxywh.g_w+5>scrn_x+scrn_w) { oxywh.g_x=scrn_x+scrn_w-oxywh.g_w-5; }
- if (oxywh.g_y+(n+1)*16+24>scrn_y+scrn_h) { oxywh.g_y=scrn_y+scrn_h-((n+1)*16+24); }
-
- for(f=1;f<(n+1);f++)
- {
- lt++;
- lt->ob_next=f+1;
- lt->ob_head=-1;
- lt->ob_tail=-1;
- lt->ob_flags= mask_selectable | mask_exit | mask_rbutton;
- if (f==current) /*Highlight the current selection*/
- {
- lt->ob_state=mask_selected;
- lt->ob_flags=mask_selectable | mask_exit | mask_rbutton | mask_default;
- } else {
- lt->ob_state=0;
- }
- lt->ob_type=G_TEXT;
- lt->ob_x=5;
- lt->ob_y=f*16+10;
- lt->ob_width=oxywh.g_w-10;
- lt->ob_height=16;
- #ifdef __USE_GNU
- lt->ob_spec=(unsigned long)ltb;
- #else
- lt->ob_spec=(OBJECT*)ltb;
- #endif
- ltb->te_ptext=t[f];
- ltb->te_ptmplt=t[f];
- ltb->te_pvalid=t[f];
- ltb->te_font=3;
- ltb->te_just=0;
- ltb->te_color=4464;
- ltb->te_tmplen=ltb->te_txtlen=strlen(t[f])+1;
- ltb++;
- }
-
- lt++;
- lt->ob_type=G_BOX;
- lt->ob_next=0;
- lt->ob_head=n+2;
- lt->ob_tail=n+2;
- lt->ob_flags=0;
- lt->ob_state=0;
- lt->ob_type=G_BOX;
- lt->ob_x=0;
- lt->ob_y=0;
- lt->ob_width=oxywh.g_w;
- lt->ob_height=18;
- #ifdef __USE_GNU
- lt->ob_spec=(unsigned long)70129;
- #else
- lt->ob_spec=(OBJECT*)70129;
- #endif
-
- lt++;
-
- lt->ob_next=n+1; /*Current Selection Text*/
- lt->ob_head=-1;
- lt->ob_tail=-1;
- lt->ob_flags=LASTOB;
- lt->ob_state=0;
- lt->ob_type=G_TEXT;
- lt->ob_x=5;
- lt->ob_y=1;
- lt->ob_width=oxywh.g_w-10;
- lt->ob_height=16;
- #ifdef __USE_GNU
- lt->ob_spec=(unsigned long)ltb;
- #else
- lt->ob_spec=(OBJECT*)ltb;
- #endif
- ltb->te_ptext=t[0];
- ltb->te_ptmplt=t[0];
- ltb->te_pvalid=t[0];
- ltb->te_font=3;
- ltb->te_just=0;
- ltb->te_color=4208;
- ltb->te_tmplen=ltb->te_txtlen=strlen(t[current])+1;
-
- popup->ob_x=oxywh.g_x;
- popup->ob_y=oxywh.g_y;
- popup->ob_width=oxywh.g_w;
- popup->ob_height=(n+1)*16+18;
-
- buf=(short*)malloc(((scrn_planes*(popup->ob_width+8))/4)*(popup->ob_height+8));
-
- if (buf)
- {
- scr.fd_addr=NULL;
-
- graf_mouse(M_OFF,NULL);
-
- obm.fd_addr=buf;
- obm.fd_w=popup->ob_width+6;
- obm.fd_h=popup->ob_height+6;
- obm.fd_wdwidth=(short)(obm.fd_w/8);
- obm.fd_stand=1;
- obm.fd_nplanes=scrn_planes;
-
- p[0]=popup->ob_x; p[1]=popup->ob_y;
- p[2]=p[0]+popup->ob_width+2; p[3]=p[1]+popup->ob_height+2;
- p[4]=p[5]=1;
- p[6]=p[4]+popup->ob_width+2; p[7]=p[5]+popup->ob_height+2;
- wind_update(BEG_UPDATE);
- vro_cpyfm(x_handle,S_ONLY,p,&scr,&obm);
- }else{
- form_alert(1,"[3][ | DULIB GUI ERROR: | Out of memory for popup menu | background buffering. ][ Cancel ]");
- return current;
- }
-
- objc_draw(popup,0,5,oxywh.g_x,oxywh.g_y,oxywh.g_w+5,(n+1)*16+20);
-
- graf_mouse(M_ON,NULL);
-
- wind_update(BEG_MCTRL);
-
- ex_f=rtn=0; c=current;
-
- graf_mouse(USER_DEF,&SIDEARRW);
-
- while (!ex_f) {
-
- if (sel_f)
- {
- #ifndef __USE_GNU
- e=evnt_multi(MU_KEYBD|MU_BUTTON|MU_M1|MU_TIMER, 1, 1, 1, 1, mx, my, 1, 1,0,0,0,0,0,
- messB,100,0,&mx,&my,&mb,&dummy,&dummy,&dummy);
- #else
- e=evnt_multi(MU_KEYBD|MU_BUTTON|MU_M1|MU_TIMER, 1, 1, 1, 1,mx,my,1,1,0,0,0,0,0,
- messB,100,&mx,&my,&mb,&dummy,&dummy,&dummy);
- #endif
- }else{
- #ifndef __USE_GNU
- e=evnt_multi(MU_BUTTON|MU_M1, 1, 1, 1, 1, mx, my, 1, 1,0,0,0,0,0,
- messB,100,0,&mx,&my,&mb,&dummy,&dummy,&dummy);
- #else
- e=evnt_multi(MU_BUTTON|MU_M1, 1, 1, 1, 1,mx,my,1,1,0,0,0,0,0,
- messB,100,&mx,&my,&mb,&dummy,&dummy,&dummy);
- #endif
- if ((e&MU_BUTTON)==0) graf_mkstate(&mx,&my,&mb,&junk);
- }
-
- rtn=objc_find(popup,0,1,mx,my);
- if ((rtn>n)||(rtn<1)) rtn=current;
-
- if (rtn!=c)
- {
- if (c)
- objc_change(popup,c,0,oxywh.g_x,oxywh.g_y,oxywh.g_w+5,(n+1)*16+20, 0, 1);
-
- c=rtn;
-
- if (c)
- objc_change(popup,c,0,oxywh.g_x,oxywh.g_y,oxywh.g_w+5,(n+1)*16+20, mask_selected, 1);
- }
-
- if ((sel_f==FALSE)&&(mb==1))
- ex_f=1;
-
- if ((sel_f==TRUE)&&(mb==0))
- ex_f=1;
- }
-
- graf_mouse(ARROW,NULL);
- graf_mouse(M_OFF,NULL);
-
- scr.fd_addr=NULL;
- p[0]=p[1]=1;
- p[2]=p[0]+popup->ob_width+2; p[3]=p[1]+popup->ob_height+2;
- p[4]=popup->ob_x; p[5]=popup->ob_y;
- p[6]=p[4]+popup->ob_width+2; p[7]=p[5]+popup->ob_height+2;
- vro_cpyfm(x_handle,S_ONLY,p,&obm,&scr);
-
- graf_mouse(M_ON,NULL);
- free(buf);
-
- wind_update(END_MCTRL);
-
- wind_update(END_UPDATE);
- }
-
- do {
- graf_mkstate(&junk,&junk,&mb,&junk);
- } while (mb!=0);
-
- return rtn;
- }
-